home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / progjour / 1991 / 06 / alib / setarg.asm < prev    next >
Assembly Source File  |  1991-06-25  |  2KB  |  132 lines

  1.     title    set argc argv
  2.     include    asm.inc
  3.  
  4.     public    read_command_line
  5.     public    read_environment
  6.     public    set_argc_argv
  7.     public    strskp_white
  8.  
  9.  
  10.     .data
  11.     extw    psp
  12.  
  13.     .data?
  14.     public    argc,argv
  15. argc        dw    ?
  16. argv        dd    ?
  17.  
  18.     .code
  19.     extn    malloc,ms_dos,strcpy,strskp
  20.  
  21.  
  22. ;;    read command line
  23. ;
  24. ;    exit    DS:SI    program command line
  25. ;
  26. read_command_line proc
  27.     mov    ds,psp[bp]
  28.     mov    si,81h
  29.     ret
  30. read_command_line endp
  31.  
  32.  
  33. ;;    read environment
  34. ;
  35. ;    exit    DS:SI    environment
  36. ;
  37. read_environment proc
  38.     xor    si,si
  39.     mov    ds,psp[bp]
  40.     mov    ds,[si+2Ch]
  41.     ret
  42. read_environment endp
  43.  
  44.  
  45. ;;    set argc argv
  46. ;
  47. ;    exit    Cf    if no memory
  48. ;    uses    AX,CX,DI,SI,ES,DS
  49. ;
  50. set_argc_argv proc
  51.     mov    cx,256
  52.     call    malloc
  53.     jc    saa9            ; if no memory
  54.  
  55.     mov    argc[bp],1
  56.     mov    wptr argv[bp],di
  57.     mov    wptr argv[bp+2],es
  58.  
  59.     mov    ah,30h
  60.     call    ms_dos
  61.     cmp    al,3
  62.     jb    saa10            ;  if prior to DOS version 3.x
  63.  
  64.     call    read_environment    ; skip environment
  65. saa1:    call    strskp
  66.     lodsb
  67.     cmp    al,NULL_CHAR
  68.     jne    saa1
  69.     lodsw                ;  (skip 1)
  70.  
  71.     call    strcpy            ; copy program name which appears
  72.     inc    di            ;  after environment
  73.  
  74. saa2:    call    read_command_line
  75. saa3:    call    strskp_white
  76.     cmp    al,CR_CHAR
  77.     je    saa7            ; if no more arguments
  78.  
  79.     inc    argc[bp]
  80.     jmp    saa5
  81. saa4:    stosb
  82. saa5:    lodsb
  83.     cmp    al,SPACE_CHAR
  84.     jbe    saa6
  85.     cmp    al,','
  86.     je    saa6
  87.     cmp    al,'~'
  88.     jbe    saa4
  89.  
  90. saa6:    cmp    al,CR_CHAR
  91.     mov    al,NULL_CHAR
  92.     stosb
  93.     jne    saa3
  94.  
  95. saa7:    inc    di            ; word align table
  96.     and    di,-2
  97.  
  98.     lds    si,argv[bp]        ; get ptr to first argument
  99.     mov    wptr argv[bp],di    ; set pointer list offset
  100.     mov    cx,argc[bp]        ; get list count (cannot==0)
  101.  
  102. saa8:    mov    ax,si            ; build pointer list
  103.     stosw
  104.     call    strskp
  105.     loop    saa8
  106.     clc
  107. saa9:    ret
  108.  
  109. saa10:    mov    ax,'C'
  110.     stosw
  111.     jmp    saa2
  112. set_argc_argv endp
  113.  
  114.  
  115. ;;    strskp white
  116. ;
  117. ;    entry    DS:SI    text ptr
  118. ;    exit    SI    updated past spaces and tabs
  119. ;        AL    non-white character
  120. ;
  121. strskp_white proc
  122.     lodsb
  123.     cmp    al,SPACE_CHAR
  124.     je    strskp_white
  125.     cmp    al,TAB_CHAR
  126.     je    strskp_white
  127.     dec    si
  128.     ret
  129. strskp_white endp
  130.  
  131.     end
  132.